// 将多次高频操作优化为只在最后一次执行（某个函数在某短时间内，无论触发了多少次回调，都只执行最后一次）通常使用场景：用户输入

// 简易版
function debounce(fn, wait) {
  let timer = null
  return function() {
    if (timer) clearTimeout(timer)
    timer = settimeout(fn, wait)
  }
}

/**
 * @desc  函数防抖---“立即执行版本” 和 “非立即执行版本” 的组合版本
 * @param  func 需要执行的函数
 * @param  wait 延迟执行时间（毫秒）
 * @param  immediate---true 表立即执行，false 表非立即执行
 **/
function debounce2(fn, wait, immediate) {
  let timer = null
  return function(...args) {
    const context = this
    if (timer) clearTimeout(timer)
    if (immediate) {
      let callNow = !timer
      timer = setTimeout(() => {
        timer = null
      }, wait);
      if (callNow) fn.apply(context, args)
    } else {
      timer = setTimeout(function() {
        fn.apply(context, args)
      }, timeout);
    }
  }
}